/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Presenter;

import View.TelaPrincipalView;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Bush
 */
public class ServidorUDPPresenter implements Runnable{

    //----------------------Servidor Conexão--------------------------
    private static final double LOSS_RATE = 0.3;
    private static final int AVERAGE_DELAY = 100; // milliseconds
    private String porta;
    private static String mens = "";
    private TelaPrincipalView view;
    
    public ServidorUDPPresenter() {
        view = new TelaPrincipalView();
        
        porta = "3000";
        try {
            //servidorPingUdp(porta);
        } catch (Exception ex) {

            JOptionPane.showMessageDialog(null, ex);
        }

    }

    public void servidorPingUdp(String porta) throws SocketException, IOException, Exception {
       
        int port = Integer.parseInt(porta);
        Random random = new Random();
        DatagramSocket socket = new DatagramSocket(port);

        while (true) {
            // Cria um pacote datagrama para segurar incomming pacote UDP.
            DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
            // Bloco até o anfitrião recebe um pacote UDP
           
            socket.receive(request);
            InetAddress clientAddress = request.getAddress();
            
            TelaPrincipalPresenter.usuariosOnline(request.getAddress().getHostName());
            //  Imprimir os dados recebido.
            printData(request);
            
            // Simular atraso da rede.
            //Thread.sleep((int) (random.nextDouble() * 2 * AVERAGE_DELAY));
            // Envia a resposta.
            InetAddress clientHost = request.getAddress();
            int clientPort = request.getPort();
            byte[] buf = request.getData();
            DatagramPacket reply = new DatagramPacket(buf, buf.length, clientHost, clientPort);
            socket.send(reply);           
            //System.out.println("Servidor : Resposta enviada\r\n");
            
        }
    }

    public void printData(DatagramPacket request) throws Exception {
        // / / Obter referências a variedade do pacote de bytes.
        byte[] buf = request.getData();
        // Enrole os bytes em um fluxo de entrada matriz de bytes,
        // Para que você possa ler os dados como um fluxo de bytes.
        ByteArrayInputStream bais = new ByteArrayInputStream(buf);
        // Enrole o fluxo de saída de matriz de bytes em um leitor de fluxo de entrada,
        // Para que você possa ler os dados como um fluxo de caracteres.
        InputStreamReader isr = new InputStreamReader(bais);
        //  Envolver o leitor fluxo de entrada em um leitor bufferred,
        // Para que você possa ler os dados de caracteres de uma linha de cada vez. 
        // (A linha é uma seqüência de caracteres terminados por qualquer combinação de \ r \ n) 
        BufferedReader br = new BufferedReader(isr);
        // Os dados da mensagem está contida em uma única linha, assim que ler esta linha.
        String line = br.readLine();
        //  Imprime endereço de host e os dados recebidos a partir dele.
        System.out.println("Cliente: "+request.getAddress().getHostName() +"IP: "+ request.getAddress().getHostAddress() + "\r\n" + new String(line) );
    }

    @Override
    public void run() {
        try {
            servidorPingUdp(porta);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
}
